<?php
class Delivery_Model_Mapper_ProductosPedido
	extends Delivery_Model_Mapper_Abstract
{
	public function getDbTable()
	{
		return parent::getDbTable( 'ProductosPedidos' );
	}
	
	public function save ( $producto, $actualizarStock = true, $vendido = true )
	{
		
		$dbTable= $this->getDbTAble();
		$dbTable->guardar( $producto );		
		
		if ( $actualizarStock ){
			
			if ( $vendido ){
				$producto->cantidadDisponible-= $producto->cantidad; 
				$producto->cantidadVendida+= $producto->cantidad; 
			} else { 
				
				$producto->cantidadDisponible+= $producto->cantidad; 
				$producto->cantidadVendida-= $producto->cantidad;
				
			}
			
			$mapper = Delivery_Model_Factory::mapper( 'Productos' );
			$mapper->save( $producto, false );
		}
		
	}
	
	public function inAnyOrder( $idProducto )
	{
		$dbTable= $this->getDbTAble();
		$rowset = $dbTable->getById( $idProducto );		
		
		return empty($rowset) ? false : true;
	}
	
    public function inAnyOrderOpcion( $idOpcion )
	{
		$dbTable= $this->getDbTAble();
		
		return $dbTable->inAnyOrderOpcion( $idOpcion );
	}
	
	public function getByParentId( $idProducto , $idNegocio = null ){
		$mapper = Delivery_Model_Factory::mapper('Productos');
		$producto = $mapper->getById($idProducto, $idNegocio);
		return $this->_fetch( $producto->asArray() );
	}
	
	public function getByParentIds( $idsProducto ){
		$mapper = Delivery_Model_Factory::mapper('Productos');
		$productos = $mapper->getByIds($idsProducto);
		
		$collection = new Delivery_Model_Collection_ProductosPedidos;
		
		foreach ($productos as $producto){
			$collection->append(
				$this->_fetch( $producto->asArray() )
			);
		}
		
		return $collection;
	}
	
	public function getByPedido( $idPedido )
	{
		$dbTable= $this->getDbTAble();
	
		$productos = $this->_fetchCollection(
			'ProductosPedidos',
			$dbTable->getByPedido( $idPedido )
		);
		
		$this->loadCategoria( $productos );
		
		return $productos;
	}
	
	public function getByPedidos( $idsPedido )
	{
		$dbTable= $this->getDbTAble();
	
		$productos = $this->_fetchCollection(
			'ProductosPedidos',
			$dbTable->getByPedidos( $idsPedido )
		);
		
		$this->loadCategoria( $productos );
		
		return $productos;
	}
	
	
	public function loadCategoria( $productos )
	{
		$mapper = Delivery_Model_Factory::mapper('Productos');
		
		$mapper->loadCategoria( $productos );
	}
	
    public function loadOpciones( $productos )
	{
		$mapper = Delivery_Model_Factory::mapper('Productos');
		$mapper->loadOpciones( $productos );
	}
	
    public function loadOpcionesPedidas( $productos )
	{
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
	    $mapper = Delivery_Model_Factory::mapper('Opciones');
	
	    if ( $productos instanceof Delivery_Model_Collection_Productos && count($productos)){
		
			foreach ( $productos as $producto){
				
    			if( is_null($producto->opcionesIds) ){
    	 	        continue;
    	 	    }
			    
			    $opciones = $mapper->getByIds( $producto->opcionesIds );
 		
	            $mapper->loadFamilia( $opciones );
 		
 		        $producto->setOpcionesPedidas( $opciones );
			    
			}
		}
		
	 	elseif ( $productos instanceof Delivery_Model_Producto){
			
	 	    if( is_null($productos->opcionesIds) ){
	 	        return;
	 	    }
	 	    
	 		$opciones = $mapper->getByIds( $productos->opcionesIds );
 		
	        $mapper->loadFamilia( $opciones );
 		
 		    $productos->setOpcionesPedidas( $opciones );
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
	
	/**
	 * @param array
	 * @return object Delivery_Model_ProductoPedido
	 */
	protected function _fetch( $row )
	{
		$producto = new Delivery_Model_ProductoPedido( $row );
		
		$this->getIdentityMap()->set( $producto, $producto->getId() );
		
		return $producto;
	}
	
}